//ICASx01 by BR FO MN - INICIO - Inclusão da Classe Auto Scoring
package jEDF.Hypnogram;

import java.io.*;

import jEDF.EDF.*;
import jEDF.JEDF.JEDFGraph;
import jEDF.JEDF.JEDFMainWindow;
import java.awt.Cursor;

public class AutoScoring {

    private JEDFMainWindow m_mainwindow = null;
    private int m_totalepocas;
    private int m_tempoexame; //tempo total do exame em segundos
    NewHypnogramDialogAS newHypnogramDialogAS;
    //IVCx01 by BR - INICIO - Inclusão das Variáveis Canais
    private Canal m_canalF1 = null;
    private Canal m_canalF2 = null;
    private Canal m_canalC1 = null;
    private Canal m_canalC2 = null;
    private Canal m_canalO1 = null;
    private Canal m_canalO2 = null;
    private Canal m_canalChin = null;
    private Canal m_canalLOC = null;
    private Canal m_canalROC = null;
    //IVCx01 by BR - FIM - Inclusão das Variáveis Canais
    Estagios m_estagios;

    public AutoScoring(JEDFMainWindow _mainwindow) {
        m_mainwindow = _mainwindow;
        m_tempoexame = m_mainwindow.getEDFFile().getNbRecords() * m_mainwindow.getEDFFile().getRecordDuration();
        m_totalepocas = m_tempoexame / 30;

        //cria diálogo de hipnograma com epoca de 30s
        m_mainwindow.getPolysomnograph().getEpochDurationComboBox().setDuration(30);
        newHypnogramDialogAS = new NewHypnogramDialogAS(m_mainwindow, m_mainwindow.getPolysomnograph(), m_mainwindow.getHypnogram(), false, true);
        m_estagios = new Estagios(m_totalepocas);
    }

    public void startAutoScoring() {

        Cursor cursor = Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR);
        m_mainwindow.setCursor(cursor);

        //cria um novo hipnograma com épocas de 30s
        newHypnogramDialogAS.setVisible(true);

        m_estagios = new Estagios(m_totalepocas);

        GetCanais(); //procura no exame e instancia todos os canais usados pelo algoritmo

        //verifica se existe algum canal frontal antes de efetuar detecção de N3
        if (m_canalF1 == null
                || m_canalF2 != null
                || m_canalC1 != null
                || m_canalC2 != null
                || m_canalO1 != null
                || m_canalO1 != null) {

            for (int epoca = 0; epoca < m_totalepocas; epoca++) {


                //verifica se é estágio N3
                if (m_canalF1.getMaiorFreqFFT(epoca) <= 2 && m_canalF1.getMaiorFreqFFT(epoca) > 0
                        && m_canalF2.getMaiorFreqFFT(epoca) <= 2 && m_canalF2.getMaiorFreqFFT(epoca) > 0
                        && m_canalC1.getMaiorFreqFFT(epoca) <= 2 && m_canalC1.getMaiorFreqFFT(epoca) > 0
                        && m_canalC2.getMaiorFreqFFT(epoca) <= 2 && m_canalC2.getMaiorFreqFFT(epoca) > 0
                        && m_canalO1.getMaiorFreqFFT(epoca) <= 2 && m_canalO1.getMaiorFreqFFT(epoca) > 0
                        && m_canalO2.getMaiorFreqFFT(epoca) <= 2 && m_canalO2.getMaiorFreqFFT(epoca) > 0
                        && (newHypnogramDialogAS.isAmplF() ? (m_canalF1.PercentualAmplMaior(epoca, newHypnogramDialogAS.getAmplF()) > newHypnogramDialogAS.getPercF() ? true : false) : false)
                        && (newHypnogramDialogAS.isAmplF() ? (m_canalF2.PercentualAmplMaior(epoca, newHypnogramDialogAS.getAmplF()) > newHypnogramDialogAS.getPercF() ? true : false) : false)
                        && (newHypnogramDialogAS.isAmplM() ? (m_canalLOC.PercentualAmplMaior(epoca, newHypnogramDialogAS.getAmplM()) < newHypnogramDialogAS.getPercM() ? true : false) : false)
                        && (newHypnogramDialogAS.isAmplM() ? (m_canalROC.PercentualAmplMaior(epoca, newHypnogramDialogAS.getAmplM()) < newHypnogramDialogAS.getPercM() ? true : false) : false)) {
                    m_estagios.SetStageN3(epoca);
                }

                //IEWx01 by BR - INICIO -  Inclusão do Estágio W
                //verifica se é estágio Wake
                if (m_canalF1.PercentualFreq(epoca, 8, 32) > 0.4 //mais de 50% da época com alfa ou beta
                        || m_canalF2.PercentualFreq(epoca, 8, 32) > 0.5
                        || m_canalC1.PercentualFreq(epoca, 8, 32) > 0.5
                        || m_canalC2.PercentualFreq(epoca, 8, 32) > 0.5
                        || m_canalO1.PercentualFreq(epoca, 8, 32) > 0.5
                        || m_canalO2.PercentualFreq(epoca, 8, 32) > 0.5
                        || m_canalF1.PercentualAmplMenor(epoca, 20) == 1.0 //baixas amplitudes se não tiver alfa ou beta
                        || m_canalF2.PercentualAmplMenor(epoca, 20) == 1.0
                        || m_canalC1.PercentualAmplMenor(epoca, 20) == 1.0
                        || m_canalC2.PercentualAmplMenor(epoca, 20) == 1.0
                        || m_canalO1.PercentualAmplMenor(epoca, 20) == 1.0
                        || m_canalO2.PercentualAmplMenor(epoca, 20) == 1.0
                        || m_canalLOC.getMaiorAmpl(epoca) >= 65 // amplitude alta no olho = acordou
                        || m_canalROC.getMaiorAmpl(epoca) >= 65) {
                    m_estagios.SetStageAwake(epoca);
                }
                //IEWx01 by BR - FIM -  Inclusão do Estágio W


                //IERx01 by BR - INICIO -  Inclusão do Estágio R
                //verifica se é estágio REM
                if (m_canalF1.PercentualFreq(epoca, 4, 13) > 0.5
                        || m_canalF2.PercentualFreq(epoca, 4, 13) > 0.5
                        || m_canalC1.PercentualFreq(epoca, 4, 13) > 0.5
                        || m_canalC2.PercentualFreq(epoca, 4, 13) > 0.5
                        || m_canalO1.PercentualFreq(epoca, 4, 13) > 0.5
                        || m_canalO2.PercentualFreq(epoca, 4, 13) > 0.5
                        && m_canalChin.getMediaAmpl(epoca) <= 20) {
                   // m_estagios.SetStageREM(epoca);
                }
                //IERx01 by BR - FIM -  Inclusão do Estágio R

            }

        }

        //define filtro AntiAliasing
        m_estagios.setAntiAliasing(newHypnogramDialogAS.getAA());

        //preenche arquivo de hipnograma
        m_estagios.FillHypnogram(m_mainwindow.getHypnogram());

        //atualiza janela do programa e desenha hipnograma gerado
        m_mainwindow.updatePermissions();

        cursor = Cursor.getDefaultCursor();
        m_mainwindow.setCursor(cursor);
    }

    public void GetCanais() {

        //se canais ja foram recuperados não precisa recuperar de novo
        if (m_canalF1 != null || m_canalF2 != null || m_canalC1 != null || m_canalC2 != null || m_canalO1 != null || m_canalO1 != null) {
            return;
        }

        JEDFGraph[] graphs = m_mainwindow.getPolysomnograph().getAllGraphs(); //Recuperando todos os canais do exame

        for (int i = 0; i < graphs.length; i++) { //separa os canais frontais e extrai suas FFT's
            EDFSignal signal = (EDFSignal) graphs[i].getSignal(); //i-ésimo canal do exame

            //se nome do canal começa com F então é o frontal
            if (signal.getLabel().toUpperCase().startsWith("FP")
                    || signal.getLabel().toUpperCase().startsWith("F1")
                    || signal.getLabel().toUpperCase().startsWith("F2")
                    || signal.getLabel().toUpperCase().startsWith("F3")
                    || signal.getLabel().toUpperCase().startsWith("F4")) {

                if (m_canalF1 == null) { //salva canal FFT do canal frontal 1
                    m_canalF1 = new Canal(signal);
                } else { //salva canal FFT do canal frontal 2 (caso haja)
                    m_canalF2 = new Canal(signal);
                }
            }

            //se nome do canal começa com C então é o central
            if (signal.getLabel().toUpperCase().startsWith("CZ")
                    || signal.getLabel().toUpperCase().startsWith("C1")
                    || signal.getLabel().toUpperCase().startsWith("C2")
                    || signal.getLabel().toUpperCase().startsWith("C3")
                    || signal.getLabel().toUpperCase().startsWith("C4")) {

                if (m_canalC1 == null) { //salva canal FFT do canal central 1
                    m_canalC1 = new Canal(signal);
                } else { //salva canal FFT do canal central 2 (caso haja)
                    m_canalC2 = new Canal(signal);
                }
            }

            //se nome do canal começa com O então é o occipital
            if (signal.getLabel().toUpperCase().startsWith("OZ")
                    || signal.getLabel().toUpperCase().startsWith("O1")
                    || signal.getLabel().toUpperCase().startsWith("O2")
                    || signal.getLabel().toUpperCase().startsWith("O3")
                    || signal.getLabel().toUpperCase().startsWith("O4")) {

                if (m_canalO1 == null) { //salva canal FFT do canal central 1
                    m_canalO1 = new Canal(signal);
                } else { //salva canal FFT do canal occipital 2 (caso haja)
                    m_canalO2 = new Canal(signal);
                }
            }

            //se nome do canal começa com O então é o Chin
            if (signal.getLabel().toUpperCase().startsWith("CHIN")) {
                m_canalChin = new Canal(signal);
            }

            if (signal.getLabel().toUpperCase().startsWith("LOC")) {
                m_canalLOC = new Canal(signal);
            }

            if (signal.getLabel().toUpperCase().startsWith("ROC")) {
                m_canalROC = new Canal(signal);
            }
        }

    }
}
//ICASx01 by BR FO MN - FIM - Inclusão da Classe Auto Scoring

